import type { RouteRecordRaw } from 'vue-router'

export interface IBreadcrumbs {
  name: string
  path: string
}

export let firstMenu: any = null

export function mapMenusToRoutes(userMenus: any[]) {
  /**
   * 将路由规则对象添加到数组中
   * RouteRecordRaw路由对象的类型，如果实际开发中不会写就写any
   */
  const localRoutes: RouteRecordRaw[] = []

  /**
   * 1.读取router/main中所有ts文件，在webpack中是通过require.context，vite则通过import.meta读取文件
   * 2.但是这里除了返回文件路径给我们以外，还会返回给我们一个函数，这个函数意味着该方法不会将这个模块（或者说组件）直接返回给我们，
   * 而是通过懒加载的方式返回给我们，但是我们需要立即获得，所以我们就需要设置参数 eager: true
   * 3.注意，我们查看files的数据类型会发现它是 Record<string, unknown>类型，但是我们并不希望有unknown类型存在，所以我们需要手动
   * 将其设置为any
   */
  const files: Record<string, any> = import.meta.glob('../router/main/**/*.ts', {
    eager: true
  })

  for (const key in files) {
    const module = files[key]
    localRoutes.push(module.default)
  }

  const routes: RouteRecordRaw[] = []

  // 对一级路由进行遍历
  for (const menu of userMenus) {
    // 遍历一级路由的子路由
    for (const submenu of menu.children) {
      // 通过find方法判断该用户是否有路由规则中对应路由的权限
      const route = localRoutes.find((item) => item.path === submenu.url)
      if (route) {
        routes.push(route)
      }
      // 记录第一个被匹配到的菜单
      if (!firstMenu && route) {
        firstMenu = submenu
      }
    }
  }

  return routes
}

/**
 * 根据路径匹配需要高亮显示的菜单
 * @param path 需要匹配的路径
 * @param userMenus  当前用户权限菜单
 */
export const mapPathToMenu = (path: string, userMenus: any[]) => {
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        return submenu
      }
    }
  }
}

/**
 * 返回面包屑组件所需数据
 * @param path
 * @param userMenus
 */
export const mapPathToBreadcrumbs = (path: string, userMenus: any[]) => {
  const breadcrumbs: IBreadcrumbs[] = []

  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        // 存入父级的路径和名称
        breadcrumbs.push({ name: menu.name, path: menu.children[0].url })
        // 存入当前子节点的路径和名称
        breadcrumbs.push({ name: submenu.name, path: submenu.url })
      }
    }
  }

  return breadcrumbs
}

/**
 * 菜单映射到id的列表
 * @param menuList
 */
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []

  function recurseGetId(menus: any[]) {
    for (const item of menus) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }

  recurseGetId(menuList)

  return ids
}

/**
 * 用户权限控制
 * @param menuList 菜单的列表
 * @return 权限数据
 */
export function mapMenuListToPermissions(menuList: any[]) {
  const permissions: string[] = []

  function recurseGetPermission(menus: any[]) {
    for (const item of menus) {
      if (item.type === 3) {
        permissions.push(item.permission)
      } else if (item.children) {
        recurseGetPermission(item.children)
      }
    }
  }

  recurseGetPermission(menuList)

  console.log(permissions)

  return permissions
}
